--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
visualiser-wasm/internal/graph/build.go 67e78aa299d1bde9de61fcc4dc3e95a36eeb92d6 (67e78aa2) Text, 11.26 KB
T8b949e// SPDX-License-Identifier: 0BSD
Tff7b72package Te6edf3graph
Tff7b72import Tb4b4b4(
Ta5d6ff"strconv"
Ta5d6ff"strings"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/filter"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/hashpos"
Ta5d6ff"github.com/Quad4-Software/MeshChatX/visualiser-wasm/internal/icon"
Tb4b4b4)
T8b949e// XY is a 2D position.
Tff7b72type Te6edf3XY Tff7b72struct Tb4b4b4{
Te6edf3X Tffa657float64 Ta5d6ff`json:"x"`
Te6edf3Y Tffa657float64 Ta5d6ff`json:"y"`
Tb4b4b4}
T8b949e// UserIcon is an lxmf custom icon descriptor.
Tff7b72type Te6edf3UserIcon Tff7b72struct Tb4b4b4{
Te6edf3IconName Tffa657string Ta5d6ff`json:"icon_name"`
Te6edf3ForegroundColour Tffa657string Ta5d6ff`json:"foreground_colour"`
Te6edf3BackgroundColour Tffa657string Ta5d6ff`json:"background_colour"`
Tb4b4b4}
T8b949e// Announce is the announce fields needed for graph build.
Tff7b72type Te6edf3Announce Tff7b72struct Tb4b4b4{
Te6edf3DestinationHash Tffa657string Ta5d6ff`json:"destination_hash"`
Te6edf3Aspect Tffa657string Ta5d6ff`json:"aspect"`
Te6edf3DisplayName Tffa657string Ta5d6ff`json:"display_name"`
Te6edf3CustomDisplayName Tffa657string Ta5d6ff`json:"custom_display_name"`
Te6edf3IdentityHash Tffa657string Ta5d6ff`json:"identity_hash"`
Te6edf3LastSeen Tffa657string Ta5d6ff`json:"last_seen"`
Tb4b4b4}
T8b949e// Conversation carries optional lxmf user icon data.
Tff7b72type Te6edf3Conversation Tff7b72struct Tb4b4b4{
Te6edf3LxmfUserIcon Tff7b72*Te6edf3UserIcon Ta5d6ff`json:"lxmf_user_icon"`
Tb4b4b4}
T8b949e// Request is the buildPathGraph input payload.
Tff7b72type Te6edf3Request Tff7b72struct Tb4b4b4{
Te6edf3PathTable Tb4b4b4[Tb4b4b4]Te6edf3filterTb4b4b4.Te6edf3PathEntry Ta5d6ff`json:"path_table"`
Te6edf3Announces Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3Announce Ta5d6ff`json:"announces"`
Te6edf3Conversations Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3Conversation Ta5d6ff`json:"conversations"`
Te6edf3IconCache Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657string Ta5d6ff`json:"icon_cache"`
Te6edf3Positions Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3XY Ta5d6ff`json:"positions"`
Te6edf3HopMax Tff7b72*Tffa657float64 Ta5d6ff`json:"hop_max"`
Te6edf3Search Tffa657string Ta5d6ff`json:"search"`
Te6edf3DarkMode Tffa657bool Ta5d6ff`json:"dark_mode"`
Te6edf3LOD Tffa657string Ta5d6ff`json:"lod"`
Te6edf3Aspects Tb4b4b4[Tb4b4b4]Tffa657string Ta5d6ff`json:"aspects"`
Te6edf3QueueIcons Tffa657bool Ta5d6ff`json:"queue_icons"`
Te6edf3IconGeneration Tffa657int Ta5d6ff`json:"icon_generation"`
Tb4b4b4}
T8b949e// NodeOut is one announce node for vis-network.
Tff7b72type Te6edf3NodeOut Tff7b72struct Tb4b4b4{
Te6edf3ID Tffa657string Ta5d6ff`json:"id"`
Te6edf3Group Tffa657string Ta5d6ff`json:"group"`
Te6edf3Size Tffa657float64 Ta5d6ff`json:"size"`
Te6edf3OriginalSize Tffa657float64 Ta5d6ff`json:"_originalSize"`
Te6edf3Shape Tffa657string Ta5d6ff`json:"shape"`
Te6edf3OriginalShape Tffa657string Ta5d6ff`json:"_originalShape"`
Te6edf3Image Tffa657string Ta5d6ff`json:"image,omitempty"`
Te6edf3Label Tffa657string Ta5d6ff`json:"label"`
Te6edf3Title Tffa657string Ta5d6ff`json:"title"`
Te6edf3Font Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657any Ta5d6ff`json:"font"`
Te6edf3Color Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657any Ta5d6ff`json:"color"`
Te6edf3X Tffa657float64 Ta5d6ff`json:"x"`
Te6edf3Y Tffa657float64 Ta5d6ff`json:"y"`
Te6edf3ParentInterface Tffa657string Ta5d6ff`json:"_parentInterface,omitempty"`
Tb4b4b4}
T8b949e// EdgeOut is one path edge for vis-network.
Tff7b72type Te6edf3EdgeOut Tff7b72struct Tb4b4b4{
Te6edf3ID Tffa657string Ta5d6ff`json:"id"`
Te6edf3From Tffa657string Ta5d6ff`json:"from"`
Te6edf3To Tffa657string Ta5d6ff`json:"to"`
Te6edf3Color Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657any Ta5d6ff`json:"color"`
Te6edf3Width Tffa657float64 Ta5d6ff`json:"width"`
Te6edf3Hidden Tffa657bool Ta5d6ff`json:"hidden"`
Tb4b4b4}
T8b949e// Result is the buildPathGraph output payload.
Tff7b72type Te6edf3Result Tff7b72struct Tb4b4b4{
Te6edf3Nodes Tb4b4b4[Tb4b4b4]Te6edf3NodeOut Ta5d6ff`json:"nodes"`
Te6edf3Edges Tb4b4b4[Tb4b4b4]Te6edf3EdgeOut Ta5d6ff`json:"edges"`
Te6edf3IconQueue Tb4b4b4[Tb4b4b4]Te6edf3iconTb4b4b4.Te6edf3QueueItem Ta5d6ff`json:"icon_queue"`
Te6edf3ProcessedNodeIDs Tb4b4b4[Tb4b4b4]Tffa657string Ta5d6ff`json:"processed_node_ids"`
Te6edf3ProcessedEdgeIDs Tb4b4b4[Tb4b4b4]Tffa657string Ta5d6ff`json:"processed_edge_ids"`
Tb4b4b4}
Tff7b72var Te6edf3defaultAspects Tb4b4b4= Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4{Ta5d6ff"lxmf.delivery"Tb4b4b4, Ta5d6ff"nomadnetwork.node"Tb4b4b4}
T8b949e// Shared immutable style maps reused across nodes and edges to cut allocs.
Tff7b72var Tb4b4b4(
Te6edf3fontHighLight Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"color"Tb4b4b4: Ta5d6ff"#ffffff"Tb4b4b4, Ta5d6ff"size"Tb4b4b4: T79c0ff11.0Tb4b4b4}
Te6edf3fontHighDark Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"color"Tb4b4b4: Ta5d6ff"#000000"Tb4b4b4, Ta5d6ff"size"Tb4b4b4: T79c0ff11.0Tb4b4b4}
Te6edf3fontHidden Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"size"Tb4b4b4: T79c0ff0.0Tb4b4b4}
Te6edf3colorLxmfDirectLight Tb4b4b4= Te6edf3nodeColorTb4b4b4(Ta5d6ff"#10b981"Tb4b4b4, Ta5d6ff"#ecfdf5"Tb4b4b4)
Te6edf3colorLxmfDirectDark Tb4b4b4= Te6edf3nodeColorTb4b4b4(Ta5d6ff"#10b981"Tb4b4b4, Ta5d6ff"#064e3b"Tb4b4b4)
Te6edf3colorLxmfMultiLight Tb4b4b4= Te6edf3nodeColorTb4b4b4(Ta5d6ff"#3b82f6"Tb4b4b4, Ta5d6ff"#eff6ff"Tb4b4b4)
Te6edf3colorLxmfMultiDark Tb4b4b4= Te6edf3nodeColorTb4b4b4(Ta5d6ff"#3b82f6"Tb4b4b4, Ta5d6ff"#1e40af"Tb4b4b4)
Te6edf3colorNomadDirectLight Tb4b4b4= Te6edf3nodeColorTb4b4b4(Ta5d6ff"#10b981"Tb4b4b4, Ta5d6ff"#ecfdf5"Tb4b4b4)
Te6edf3colorNomadDirectDark Tb4b4b4= Te6edf3nodeColorTb4b4b4(Ta5d6ff"#10b981"Tb4b4b4, Ta5d6ff"#064e3b"Tb4b4b4)
Te6edf3colorNomadMultiLight Tb4b4b4= Te6edf3nodeColorTb4b4b4(Ta5d6ff"#8b5cf6"Tb4b4b4, Ta5d6ff"#f5f3ff"Tb4b4b4)
Te6edf3colorNomadMultiDark Tb4b4b4= Te6edf3nodeColorTb4b4b4(Ta5d6ff"#8b5cf6"Tb4b4b4, Ta5d6ff"#4c1d95"Tb4b4b4)
Te6edf3edgeDirectLight Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"color"Tb4b4b4: Ta5d6ff"#10b981"Tb4b4b4, Ta5d6ff"opacity"Tb4b4b4: T79c0ff1.0Tb4b4b4}
Te6edf3edgeDirectDark Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"color"Tb4b4b4: Ta5d6ff"#34d399"Tb4b4b4, Ta5d6ff"opacity"Tb4b4b4: T79c0ff1.0Tb4b4b4}
Te6edf3edgeMultiLight Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"color"Tb4b4b4: Ta5d6ff"#3b82f6"Tb4b4b4, Ta5d6ff"opacity"Tb4b4b4: T79c0ff0.5Tb4b4b4}
Te6edf3edgeMultiDark Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{Ta5d6ff"color"Tb4b4b4: Ta5d6ff"#60a5fa"Tb4b4b4, Ta5d6ff"opacity"Tb4b4b4: T79c0ff0.5Tb4b4b4}
Te6edf3imgUser1Hop Tb4b4b4= Ta5d6ff"/assets/images/network-visualiser/user_1hop.png"
Te6edf3imgUser Tb4b4b4= Ta5d6ff"/assets/images/network-visualiser/user.png"
Te6edf3imgServer1Hop Tb4b4b4= Ta5d6ff"/assets/images/network-visualiser/server_1hop.png"
Te6edf3imgServer Tb4b4b4= Ta5d6ff"/assets/images/network-visualiser/server.png"
Tb4b4b4)
T8b949e// BuildPathGraph constructs announce nodes and edges from the path table.
Tff7b72func Te6edf3BuildPathGraphTb4b4b4(Te6edf3req Te6edf3RequestTb4b4b4) Te6edf3Result Tb4b4b4{
Te6edf3aspects Tff7b72:= Te6edf3reqTb4b4b4.Te6edf3Aspects
Tff7b72if Tffa657lenTb4b4b4(Te6edf3aspectsTb4b4b4) Tff7b72== T79c0ff0 Tb4b4b4{
Te6edf3aspects Tb4b4b4= Te6edf3defaultAspects
Tb4b4b4}
Te6edf3aspectSet Tff7b72:= Tffa657makeTb4b4b4(Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3aspectsTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3a Tff7b72:= Tff7b72range Te6edf3aspects Tb4b4b4{
Te6edf3aspectSetTb4b4b4[Te6edf3aTb4b4b4] Tb4b4b4= Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Te6edf3searchLower Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3ToLowerTb4b4b4(Te6edf3reqTb4b4b4.Te6edf3SearchTb4b4b4)
Te6edf3fontHigh Tff7b72:= Te6edf3fontHighDark
Tff7b72if Te6edf3reqTb4b4b4.Te6edf3DarkMode Tb4b4b4{
Te6edf3fontHigh Tb4b4b4= Te6edf3fontHighLight
Tb4b4b4}
Te6edf3est Tff7b72:= Tffa657lenTb4b4b4(Te6edf3reqTb4b4b4.Te6edf3PathTableTb4b4b4)
Tff7b72if Te6edf3est Tb4b4b4> T79c0ff4096 Tb4b4b4{
Te6edf3est Tb4b4b4= T79c0ff4096
Tb4b4b4}
Te6edf3nodes Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Te6edf3NodeOutTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3estTff7b72/T79c0ff2Tff7b72+T79c0ff1Tb4b4b4)
Te6edf3edges Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Te6edf3EdgeOutTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3estTff7b72/T79c0ff2Tff7b72+T79c0ff1Tb4b4b4)
Te6edf3iconQueue Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Te6edf3iconTb4b4b4.Te6edf3QueueItemTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff32Tb4b4b4)
Te6edf3nodeIDs Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3estTff7b72/T79c0ff2Tff7b72+T79c0ff1Tb4b4b4)
Te6edf3edgeIDs Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4, T79c0ff0Tb4b4b4, Te6edf3estTff7b72/T79c0ff2Tff7b72+T79c0ff1Tb4b4b4)
Te6edf3pos Tff7b72:= Te6edf3reqTb4b4b4.Te6edf3Positions
Tff7b72if Te6edf3pos Tff7b72== Tff7b72nil Tb4b4b4{
Te6edf3pos Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3XYTb4b4b4{Tb4b4b4}
Tb4b4b4}
Te6edf3cache Tff7b72:= Te6edf3reqTb4b4b4.Te6edf3IconCache
Tff7b72if Te6edf3cache Tff7b72== Tff7b72nil Tb4b4b4{
Te6edf3cache Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}
Tb4b4b4}
Te6edf3announces Tff7b72:= Te6edf3reqTb4b4b4.Te6edf3Announces
Tff7b72if Te6edf3announces Tff7b72== Tff7b72nil Tb4b4b4{
Te6edf3announces Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3AnnounceTb4b4b4{Tb4b4b4}
Tb4b4b4}
Te6edf3conversations Tff7b72:= Te6edf3reqTb4b4b4.Te6edf3Conversations
Tff7b72if Te6edf3conversations Tff7b72== Tff7b72nil Tb4b4b4{
Te6edf3conversations Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3ConversationTb4b4b4{Tb4b4b4}
Tb4b4b4}
Tff7b72for Te6edf3i Tff7b72:= Tff7b72range Te6edf3reqTb4b4b4.Te6edf3PathTable Tb4b4b4{
Te6edf3entry Tff7b72:= Tff7b72&Te6edf3reqTb4b4b4.Te6edf3PathTableTb4b4b4[Te6edf3iTb4b4b4]
Tff7b72if Te6edf3entryTb4b4b4.Te6edf3Hops Tff7b72== Tff7b72nil Tff7b72|| Te6edf3entryTb4b4b4.Te6edf3Hash Tff7b72== Ta5d6ff"" Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Tff7b72if Te6edf3reqTb4b4b4.Te6edf3HopMax Tff7b72!= Tff7b72nil Tff7b72&& Tff7b72*Te6edf3entryTb4b4b4.Te6edf3Hops Tb4b4b4> Tff7b72*Te6edf3reqTb4b4b4.Te6edf3HopMax Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Te6edf3announceTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3announcesTb4b4b4[Te6edf3entryTb4b4b4.Te6edf3HashTb4b4b4]
Tff7b72if Tb4b4b4!Te6edf3ok Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Tff7b72if Te6edf3_Tb4b4b4, Te6edf3allow Tff7b72:= Te6edf3aspectSetTb4b4b4[Te6edf3announceTb4b4b4.Te6edf3AspectTb4b4b4]Tb4b4b4; Tb4b4b4!Te6edf3allow Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Te6edf3displayName Tff7b72:= Te6edf3announceTb4b4b4.Te6edf3CustomDisplayName
Tff7b72if Te6edf3displayName Tff7b72== Ta5d6ff"" Tb4b4b4{
Te6edf3displayName Tb4b4b4= Te6edf3announceTb4b4b4.Te6edf3DisplayName
Tb4b4b4}
Tff7b72if Tb4b4b4!Te6edf3filterTb4b4b4.Te6edf3MatchesSearchTb4b4b4(Te6edf3searchLowerTb4b4b4, Te6edf3displayNameTb4b4b4) Tff7b72&&
Tb4b4b4!Te6edf3filterTb4b4b4.Te6edf3MatchesSearchTb4b4b4(Te6edf3searchLowerTb4b4b4, Te6edf3announceTb4b4b4.Te6edf3DestinationHashTb4b4b4) Tff7b72&&
Tb4b4b4!Te6edf3filterTb4b4b4.Te6edf3MatchesSearchTb4b4b4(Te6edf3searchLowerTb4b4b4, Te6edf3announceTb4b4b4.Te6edf3IdentityHashTb4b4b4) Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Te6edf3xTb4b4b4, Te6edf3y Tff7b72:= Te6edf3resolvePositionTb4b4b4(Te6edf3entryTb4b4b4.Te6edf3HashTb4b4b4, Te6edf3entryTb4b4b4.Te6edf3InterfaceTb4b4b4, Te6edf3posTb4b4b4)
Te6edf3edgeID Tff7b72:= Te6edf3entryTb4b4b4.Te6edf3Interface Tff7b72+ Ta5d6ff"~" Tff7b72+ Te6edf3entryTb4b4b4.Te6edf3Hash
Te6edf3direct Tff7b72:= Tff7b72*Te6edf3entryTb4b4b4.Te6edf3Hops Tff7b72== T79c0ff1
Te6edf3node Tff7b72:= Te6edf3NodeOutTb4b4b4{
Te6edf3IDTb4b4b4: Te6edf3entryTb4b4b4.Te6edf3HashTb4b4b4,
Te6edf3GroupTb4b4b4: Ta5d6ff"announce"Tb4b4b4,
Te6edf3SizeTb4b4b4: T79c0ff25Tb4b4b4,
Te6edf3OriginalSizeTb4b4b4: T79c0ff25Tb4b4b4,
Te6edf3LabelTb4b4b4: Te6edf3displayNameTb4b4b4,
Te6edf3TitleTb4b4b4: Te6edf3buildTitleTb4b4b4(Te6edf3displayNameTb4b4b4, Te6edf3announceTb4b4b4.Te6edf3AspectTb4b4b4, Tff7b72*Te6edf3entryTb4b4b4.Te6edf3HopsTb4b4b4, Te6edf3entryTb4b4b4.Te6edf3InterfaceTb4b4b4, Te6edf3announceTb4b4b4.Te6edf3LastSeenTb4b4b4)Tb4b4b4,
Te6edf3FontTb4b4b4: Te6edf3fontHighTb4b4b4,
Te6edf3XTb4b4b4: Te6edf3xTb4b4b4,
Te6edf3YTb4b4b4: Te6edf3yTb4b4b4,
Te6edf3ParentInterfaceTb4b4b4: Te6edf3entryTb4b4b4.Te6edf3InterfaceTb4b4b4,
Tb4b4b4}
Te6edf3conv Tff7b72:= Te6edf3conversationsTb4b4b4[Te6edf3announceTb4b4b4.Te6edf3DestinationHashTb4b4b4]
Tff7b72switch Te6edf3announceTb4b4b4.Te6edf3Aspect Tb4b4b4{
Tff7b72case Ta5d6ff"lxmf.delivery"Tb4b4b4:
Te6edf3applyLxmfNodeTb4b4b4(Tff7b72&Te6edf3nodeTb4b4b4, Tff7b72&Te6edf3convTb4b4b4, Te6edf3directTb4b4b4, Te6edf3reqTb4b4b4.Te6edf3DarkModeTb4b4b4, Te6edf3reqTb4b4b4.Te6edf3QueueIconsTb4b4b4, Te6edf3reqTb4b4b4.Te6edf3IconGenerationTb4b4b4, Te6edf3cacheTb4b4b4, Tff7b72&Te6edf3iconQueueTb4b4b4)
Tff7b72case Ta5d6ff"nomadnetwork.node"Tb4b4b4:
Te6edf3applyNomadNodeTb4b4b4(Tff7b72&Te6edf3nodeTb4b4b4, Te6edf3directTb4b4b4, Te6edf3reqTb4b4b4.Te6edf3DarkModeTb4b4b4)
Tb4b4b4}
Te6edf3applyLODTb4b4b4(Tff7b72&Te6edf3nodeTb4b4b4, Te6edf3reqTb4b4b4.Te6edf3LODTb4b4b4, Te6edf3fontHighTb4b4b4)
Te6edf3nodes Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3nodesTb4b4b4, Te6edf3nodeTb4b4b4)
Te6edf3nodeIDs Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3nodeIDsTb4b4b4, Te6edf3nodeTb4b4b4.Te6edf3IDTb4b4b4)
Te6edf3edges Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3edgesTb4b4b4, Te6edf3EdgeOutTb4b4b4{
Te6edf3IDTb4b4b4: Te6edf3edgeIDTb4b4b4,
Te6edf3FromTb4b4b4: Te6edf3entryTb4b4b4.Te6edf3InterfaceTb4b4b4,
Te6edf3ToTb4b4b4: Te6edf3entryTb4b4b4.Te6edf3HashTb4b4b4,
Te6edf3ColorTb4b4b4: Te6edf3edgeColorTb4b4b4(Te6edf3directTb4b4b4, Te6edf3reqTb4b4b4.Te6edf3DarkModeTb4b4b4)Tb4b4b4,
Te6edf3WidthTb4b4b4: Te6edf3edgeWidthTb4b4b4(Te6edf3directTb4b4b4)Tb4b4b4,
Te6edf3HiddenTb4b4b4: Tff7b72falseTb4b4b4,
Tb4b4b4}Tb4b4b4)
Te6edf3edgeIDs Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3edgeIDsTb4b4b4, Te6edf3edgeIDTb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3ResultTb4b4b4{
Te6edf3NodesTb4b4b4: Te6edf3nodesTb4b4b4,
Te6edf3EdgesTb4b4b4: Te6edf3edgesTb4b4b4,
Te6edf3IconQueueTb4b4b4: Te6edf3iconQueueTb4b4b4,
Te6edf3ProcessedNodeIDsTb4b4b4: Te6edf3nodeIDsTb4b4b4,
Te6edf3ProcessedEdgeIDsTb4b4b4: Te6edf3edgeIDsTb4b4b4,
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3resolvePositionTb4b4b4(Te6edf3hashTb4b4b4, Te6edf3iface Tffa657stringTb4b4b4, Te6edf3pos Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3XYTb4b4b4) Tb4b4b4(Tffa657float64Tb4b4b4, Tffa657float64Tb4b4b4) Tb4b4b4{
Tff7b72if Te6edf3prevTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3posTb4b4b4[Te6edf3hashTb4b4b4]Tb4b4b4; Te6edf3ok Tb4b4b4{
Tff7b72return Te6edf3prevTb4b4b4.Te6edf3XTb4b4b4, Te6edf3prevTb4b4b4.Te6edf3Y
Tb4b4b4}
Tff7b72if Te6edf3ipTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3posTb4b4b4[Te6edf3ifaceTb4b4b4]Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3xTb4b4b4, Te6edf3y Tff7b72:= Te6edf3hashposTb4b4b4.Te6edf3AroundTb4b4b4(Te6edf3hashTb4b4b4, Te6edf3ipTb4b4b4.Te6edf3XTb4b4b4, Te6edf3ipTb4b4b4.Te6edf3YTb4b4b4, T79c0ff150Tb4b4b4, T79c0ff150Tb4b4b4)
Te6edf3posTb4b4b4[Te6edf3hashTb4b4b4] Tb4b4b4= Te6edf3XYTb4b4b4{Te6edf3XTb4b4b4: Te6edf3xTb4b4b4, Te6edf3YTb4b4b4: Te6edf3yTb4b4b4}
Tff7b72return Te6edf3xTb4b4b4, Te6edf3y
Tb4b4b4}
Te6edf3xTb4b4b4, Te6edf3y Tff7b72:= Te6edf3hashposTb4b4b4.Te6edf3XYTb4b4b4(Te6edf3hashTb4b4b4, T79c0ff600Tb4b4b4, T79c0ff200Tb4b4b4)
Te6edf3posTb4b4b4[Te6edf3hashTb4b4b4] Tb4b4b4= Te6edf3XYTb4b4b4{Te6edf3XTb4b4b4: Te6edf3xTb4b4b4, Te6edf3YTb4b4b4: Te6edf3yTb4b4b4}
Tff7b72return Te6edf3xTb4b4b4, Te6edf3y
Tb4b4b4}
Tff7b72func Te6edf3buildTitleTb4b4b4(Te6edf3displayNameTb4b4b4, Te6edf3aspect Tffa657stringTb4b4b4, Te6edf3hops Tffa657float64Tb4b4b4, Te6edf3viaTb4b4b4, Te6edf3lastSeen Tffa657stringTb4b4b4) Tffa657string Tb4b4b4{
Tff7b72var Te6edf3b Te6edf3stringsTb4b4b4.Te6edf3Builder
Te6edf3bTb4b4b4.Te6edf3GrowTb4b4b4(T79c0ff96 Tff7b72+ Tffa657lenTb4b4b4(Te6edf3displayNameTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Te6edf3aspectTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Te6edf3viaTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Te6edf3lastSeenTb4b4b4)Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Te6edf3displayNameTb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteByteTb4b4b4(Ta5d6ff'\n'Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Ta5d6ff"Aspect: "Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Te6edf3aspectTb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteByteTb4b4b4(Ta5d6ff'\n'Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Ta5d6ff"Hops: "Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Te6edf3trimFloatTb4b4b4(Te6edf3hopsTb4b4b4)Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteByteTb4b4b4(Ta5d6ff'\n'Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Ta5d6ff"Via: "Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Te6edf3viaTb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteByteTb4b4b4(Ta5d6ff'\n'Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Ta5d6ff"Last Seen: "Tb4b4b4)
Te6edf3bTb4b4b4.Te6edf3WriteStringTb4b4b4(Te6edf3lastSeenTb4b4b4)
Tff7b72return Te6edf3bTb4b4b4.Te6edf3StringTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3trimFloatTb4b4b4(Te6edf3v Tffa657float64Tb4b4b4) Tffa657string Tb4b4b4{
Tff7b72return Te6edf3strconvTb4b4b4.Te6edf3FormatFloatTb4b4b4(Te6edf3vTb4b4b4, Ta5d6ff'f'Tb4b4b4, Tff7b72-T79c0ff1Tb4b4b4, T79c0ff64Tb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3applyLxmfNodeTb4b4b4(
Te6edf3node Tff7b72*Te6edf3NodeOutTb4b4b4,
Te6edf3conv Tff7b72*Te6edf3ConversationTb4b4b4,
Te6edf3directTb4b4b4, Te6edf3darkModeTb4b4b4, Te6edf3queueIcons Tffa657boolTb4b4b4,
Te6edf3generation Tffa657intTb4b4b4,
Te6edf3cache Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657stringTb4b4b4,
Te6edf3iconQueue Tff7b72*Tb4b4b4[Tb4b4b4]Te6edf3iconTb4b4b4.Te6edf3QueueItemTb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Shape Tb4b4b4= Ta5d6ff"circularImage"
Te6edf3nodeTb4b4b4.Te6edf3OriginalShape Tb4b4b4= Ta5d6ff"circularImage"
Tff7b72if Te6edf3conv Tff7b72!= Tff7b72nil Tff7b72&& Te6edf3convTb4b4b4.Te6edf3LxmfUserIcon Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3ic Tff7b72:= Te6edf3convTb4b4b4.Te6edf3LxmfUserIcon
Te6edf3cacheKey Tff7b72:= Te6edf3icTb4b4b4.Te6edf3IconName Tff7b72+ Ta5d6ff"-" Tff7b72+ Te6edf3icTb4b4b4.Te6edf3ForegroundColour Tff7b72+ Ta5d6ff"-" Tff7b72+ Te6edf3icTb4b4b4.Te6edf3BackgroundColour Tff7b72+ Ta5d6ff"-64"
Tff7b72if Te6edf3url Tff7b72:= Te6edf3cacheTb4b4b4[Te6edf3cacheKeyTb4b4b4]Tb4b4b4; Te6edf3url Tff7b72!= Ta5d6ff"" Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Image Tb4b4b4= Te6edf3url
Tb4b4b4} Tff7b72else Tb4b4b4{
Tff7b72if Te6edf3direct Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Image Tb4b4b4= Te6edf3imgUser1Hop
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Image Tb4b4b4= Te6edf3imgUser
Tb4b4b4}
Tff7b72if Te6edf3queueIcons Tb4b4b4{
Tff7b72*Te6edf3iconQueue Tb4b4b4= Tffa657appendTb4b4b4(Tff7b72*Te6edf3iconQueueTb4b4b4, Te6edf3iconTb4b4b4.Te6edf3QueueItemTb4b4b4{
Te6edf3NodeIDTb4b4b4: Te6edf3nodeTb4b4b4.Te6edf3IDTb4b4b4,
Te6edf3CacheKeyTb4b4b4: Te6edf3cacheKeyTb4b4b4,
Te6edf3IconNameTb4b4b4: Te6edf3icTb4b4b4.Te6edf3IconNameTb4b4b4,
Te6edf3FGTb4b4b4: Te6edf3icTb4b4b4.Te6edf3ForegroundColourTb4b4b4,
Te6edf3BGTb4b4b4: Te6edf3icTb4b4b4.Te6edf3BackgroundColourTb4b4b4,
Te6edf3SizeTb4b4b4: T79c0ff64Tb4b4b4,
Te6edf3GenerationTb4b4b4: Te6edf3generationTb4b4b4,
Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Te6edf3nodeTb4b4b4.Te6edf3Size Tb4b4b4= T79c0ff30
Te6edf3nodeTb4b4b4.Te6edf3OriginalSize Tb4b4b4= T79c0ff30
Tb4b4b4} Tff7b72else Tff7b72if Te6edf3direct Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Image Tb4b4b4= Te6edf3imgUser1Hop
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Image Tb4b4b4= Te6edf3imgUser
Tb4b4b4}
Tff7b72if Te6edf3direct Tb4b4b4{
Tff7b72if Te6edf3darkMode Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Color Tb4b4b4= Te6edf3colorLxmfDirectDark
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Color Tb4b4b4= Te6edf3colorLxmfDirectLight
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Te6edf3darkMode Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Color Tb4b4b4= Te6edf3colorLxmfMultiDark
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Color Tb4b4b4= Te6edf3colorLxmfMultiLight
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3applyNomadNodeTb4b4b4(Te6edf3node Tff7b72*Te6edf3NodeOutTb4b4b4, Te6edf3directTb4b4b4, Te6edf3darkMode Tffa657boolTb4b4b4) Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Shape Tb4b4b4= Ta5d6ff"circularImage"
Te6edf3nodeTb4b4b4.Te6edf3OriginalShape Tb4b4b4= Ta5d6ff"circularImage"
Tff7b72if Te6edf3direct Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Image Tb4b4b4= Te6edf3imgServer1Hop
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Image Tb4b4b4= Te6edf3imgServer
Tb4b4b4}
Tff7b72if Te6edf3direct Tb4b4b4{
Tff7b72if Te6edf3darkMode Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Color Tb4b4b4= Te6edf3colorNomadDirectDark
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Color Tb4b4b4= Te6edf3colorNomadDirectLight
Tb4b4b4}
Tb4b4b4} Tff7b72else Tff7b72if Te6edf3darkMode Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Color Tb4b4b4= Te6edf3colorNomadMultiDark
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Color Tb4b4b4= Te6edf3colorNomadMultiLight
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3applyLODTb4b4b4(Te6edf3node Tff7b72*Te6edf3NodeOutTb4b4b4, Te6edf3level Tffa657stringTb4b4b4, Te6edf3fontHigh Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4) Tb4b4b4{
Tff7b72switch Te6edf3level Tb4b4b4{
Tff7b72case Ta5d6ff"low"Tb4b4b4:
Te6edf3nodeTb4b4b4.Te6edf3Shape Tb4b4b4= Ta5d6ff"dot"
Tff7b72if Te6edf3nodeTb4b4b4.Te6edf3ID Tff7b72== Ta5d6ff"me" Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Size Tb4b4b4= T79c0ff15
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3nodeTb4b4b4.Te6edf3Size Tb4b4b4= T79c0ff10
Tb4b4b4}
Te6edf3nodeTb4b4b4.Te6edf3Font Tb4b4b4= Te6edf3fontHidden
Tff7b72case Ta5d6ff"medium"Tb4b4b4:
Te6edf3nodeTb4b4b4.Te6edf3Shape Tb4b4b4= Te6edf3nodeTb4b4b4.Te6edf3OriginalShape
Te6edf3nodeTb4b4b4.Te6edf3Size Tb4b4b4= Te6edf3nodeTb4b4b4.Te6edf3OriginalSize
Te6edf3nodeTb4b4b4.Te6edf3Font Tb4b4b4= Te6edf3fontHidden
Tff7b72defaultTb4b4b4:
Te6edf3nodeTb4b4b4.Te6edf3Shape Tb4b4b4= Te6edf3nodeTb4b4b4.Te6edf3OriginalShape
Te6edf3nodeTb4b4b4.Te6edf3Size Tb4b4b4= Te6edf3nodeTb4b4b4.Te6edf3OriginalSize
Te6edf3nodeTb4b4b4.Te6edf3Font Tb4b4b4= Te6edf3fontHigh
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3edgeColorTb4b4b4(Te6edf3directTb4b4b4, Te6edf3darkMode Tffa657boolTb4b4b4) Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657any Tb4b4b4{
Tff7b72if Te6edf3direct Tb4b4b4{
Tff7b72if Te6edf3darkMode Tb4b4b4{
Tff7b72return Te6edf3edgeDirectDark
Tb4b4b4}
Tff7b72return Te6edf3edgeDirectLight
Tb4b4b4}
Tff7b72if Te6edf3darkMode Tb4b4b4{
Tff7b72return Te6edf3edgeMultiDark
Tb4b4b4}
Tff7b72return Te6edf3edgeMultiLight
Tb4b4b4}
Tff7b72func Te6edf3edgeWidthTb4b4b4(Te6edf3direct Tffa657boolTb4b4b4) Tffa657float64 Tb4b4b4{
Tff7b72if Te6edf3direct Tb4b4b4{
Tff7b72return T79c0ff2.5
Tb4b4b4}
Tff7b72return T79c0ff1
Tb4b4b4}
Tff7b72func Te6edf3nodeColorTb4b4b4(Te6edf3borderTb4b4b4, Te6edf3background Tffa657stringTb4b4b4) Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657any Tb4b4b4{
Tff7b72return Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{
Ta5d6ff"border"Tb4b4b4: Te6edf3borderTb4b4b4,
Ta5d6ff"background"Tb4b4b4: Te6edf3backgroundTb4b4b4,
Ta5d6ff"highlight"Tb4b4b4: Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{
Ta5d6ff"border"Tb4b4b4: Te6edf3borderTb4b4b4,
Ta5d6ff"background"Tb4b4b4: Te6edf3backgroundTb4b4b4,
Tb4b4b4}Tb4b4b4,
Ta5d6ff"hover"Tb4b4b4: Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657anyTb4b4b4{
Ta5d6ff"border"Tb4b4b4: Te6edf3borderTb4b4b4,
Ta5d6ff"background"Tb4b4b4: Te6edf3backgroundTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────